package inherit_super_final_0913;

/**
 * 调用父类的构造方法产生父类对象而后子类对象
 * 方法重写：override，返回值必须相同，除了向上转型类型的返回值以外
 * 发生在有继承关系的类之间，子类定义了和父类除了权限不同以外，其他全部相同(名称，参数列表，返回值)的方法，称之为方法的重写，子类重写的方法权限大于等于父类的权限
 * 可以用@override来看覆写是否成功
 * 只用在子类中定义了与父类名称相同的属性，无关类型，使用相同名的都是子类覆盖后的变量
 * 故而
 * super关键字：
 * 1.方法名称表示从父类中寻找同名属性名称
 * 2.在子类中调用被复写后的方法，表示从父类中寻找同名方法
 * 3.super关键字调用父类的构造方法
 * 若调用的是父类的无参构造,则可不写
 * 若调用的是父类的有参构造，则必须显示使用super(参数列表),明确表示先调用父类的构造方法
 * 放首行！！!super()和this()方法不能同时在构造方法出现
 */
public class Derive extends Base{
    int a;
    int c;
    int d;
    int e;

    public Derive() {
        super();
        System.out.println("子类构造方法");
    }

    public Derive(String e,int a, int c) {
        super('o');
        this.a = a;
        this.c = c;
    }

    public static void main(String[] args) {
        Derive derive=new Derive();
        derive.testA();//子类中
        derive.testB();
        derive.b=20;
        derive.c=20;
        derive.d=20;
        System.out.println(derive.a);//结果是0，访问的是子类中的a,就近匹配原则
        //父类和子类中属性类型不一样,可以使用super访问父类属性
        //super.a  super不能静态区域使用和this一样
        System.out.println();
    }
    public void testA(){
        System.out.println("子类中的testA()方法");
    }
    public void testB(){
        System.out.println("子类中的testB()方法");
    }
    public void test(){
        this.testA();
        super.testA();
    }
}
